package com.tedu.api.ee;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流---传输数据--传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常--标准IO
 *
 * 异常
 * Java面向对象语音，程序中所出现的所有错误，定义为对象【处理应对错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误--有解决方案
 *               编译期：RunTimeException异常表示类--
 *                      FileOutputStream创建对象--波浪线--抛出方法之外
 *                      检查异常：通常都是编译器来检查处理，程序直接保错，抛出（不合理）
 *                      解决方案：①捕获异常(*)
 *                              ②抛出异常--抛出方法之外--打印控制台
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台输出异常对象名称，RunTimeException异常表示类
 *
 *               最后了解【throw与throws--RunTimeException】
 *
 * Error错误：描述系统级别的错误--出现--程序宕机
 *           非常低---递归：自己调自己【方法】---
 */
public class EE {
    /**
     * Error错误：错误--程序严重错误
     * 模拟：方法调方法--栈溢出错误
     * StackOverflowError栈溢出错误
     *---程序宕机---后台：9亿账号
     * while(true){
     *     拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
         EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】--代码报波浪线\
     *               两种处理手段：①捕获异常
     *                          语法：try{
     *                              怀疑代码可能有异常或者提示异常
     *                          }catch(小异常名字 e){
     *                              e.printStacktrace(); 打印异常信息
     *                          }catch(中异常名字 e){
     *                              e.printStacktrace(); 打印异常信息
     *                          }catch(大异常名字 e){ Exception
     *                              e.printStacktrace(); 打印异常信息
     *                          }finally{
     *                              一定执行代码块
     *                          }
     *                          快捷键：Ctrl+AIt+T
     *                          ②抛出异常 throws 异常名字【并未解决】
     *               考试题：throw与throws的区别
     *               异常关键字：throw
     *      *                  throws
     *              非检查异常【出现运行期】--代码无错误--控制台
     * --------------------------
     * 异常：FileNotFoundException  文件不存在
     * 产生原因：路径写错，文件名写错
     * 异常：NullPointerException  空指针异常
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
     * 异常：StringIndexOutOfBoundsException   字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * 异常：NumberFormatException 数字转换异常
     * 产生原因：字符串不是正确类型
     *
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线
      //  FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台
        try {
            String str="a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);//解析字符串--转换为对应类型
        }catch(StringIndexOutOfBoundsException e){
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常:下标越界异常");
        }catch(NumberFormatException e){
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常");
        }catch(Exception e){
            e.printStackTrace();//打印异常信息
            System.out.println("大异常");
        }finally{
            System.out.println("一定执行代码块");
        }

    }
    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API---java.lang.异常
     *     字符串、包装类、集合、IO流
     */
    @Test
    public void testHomework1(){
        /**
         * 1.IllegalArgumentException 参数异常
         * 2.ClassNotFoundException   类未找到异常
         * 3.NumberFormatException    数字格式异常
         * 4.ArithmeticException     算数异常
         * 5.IOException             IO流异常
         */
    }
    public static void main(String[] args) {
        try {//1.IllegalArgumentException 参数异常
            method(-1);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            System.out.println("参数不合法");
        }try {//2.ClassNotFoundException   类未找到异常
            Class.forName("没有的类");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
            System.out.println("找不到指定的类");
        }try{//3.NumberFormatException    数字格式异常
            int num=Integer.parseInt("abc");
            System.out.println(num);
        }catch(NumberFormatException e){
            e.printStackTrace();
            System.out.println("字符串不能转换为数字");
        }try {//4.ArithmeticException     算数异常
            int a=5;
            int b=0;
            int c=a/b;
            System.out.println(c);
        }catch (ArithmeticException e){
            e.printStackTrace();
            System.out.println("除数不能为0");
        }try {//5.IOException             IO流异常
            Class.forName("没有的类");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
            System.out.println("找不到指定的类");
        }
        }
    public static void method(int num) {
        if (num < 0) {
            throw new IllegalArgumentException();
        }
    }
}

